package com.vpclub.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;

import java.util.Arrays;

/**
 * 切面类
 *
 *@Aspect：告诉Spring当前类是一个切面类
 *
 * @author : leimingchao
 * @date Date : 2021年06月25日 0:35
 */

@Aspect
public class LogAspects {

    /**
     * 抽取公共的切入点表达式
     *     1.本类引用
     *     2.其他的切面引用
     */
    @Pointcut(value = "execution(public int com.vpclub.aop.MathCalculator.*(..))")
    public void pointcut(){}

    /**
     * @Before在目标方法之前切入：切入点表达式（指定在哪个方法切入）
     */
    @Before(value = "pointcut()")
    public void logStart(JoinPoint joinPoint) {
        System.out.println(joinPoint.getSignature().getName() + "运行。。。。@Before:参数列表是：{"+Arrays.asList(joinPoint.getArgs()) +"}");
    }

    @After(value = "com.vpclub.aop.LogAspects.pointcut()")
    public void logEnd(JoinPoint joinPoint) {
        System.out.println(joinPoint.getSignature().getName() + "结束。。。。@After");
    }

    /**
     * JoinPoint参数一定要出现在参数表的第一位，否则Spring不识别
     * @param joinPoint
     * @param result
     */
    @AfterReturning(value = "pointcut()",returning = "result")
    public void logReturn(JoinPoint joinPoint, Object result) {
        System.out.println(joinPoint.getSignature().getName() + "正常返回。。。。@AfterReturning:运行结果：{"+result+"}");
    }

    /**
     * JoinPoint参数一定要出现在参数表的第一位，否则Spring不识别
     * @param joinPoint
     * @param exception
     */
    @AfterThrowing(value = "pointcut()", throwing = "exception")
    public void logException(JoinPoint joinPoint, Exception exception) {
        System.out.println(joinPoint.getSignature().getName() + "异常。。。。异常信息：{"+exception+"}");
    }
}
